Розробка програми для розв`язання систем лінійних рівнянь

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

МІНІСТЕРСТВО ОСВІТИ
Державні освітні установи
ВИЩОЇ ОСВІТИ
Вятський державний УНІВЕРСИТЕТ
ФАОТ
РОЗРОБКА ПРОГРАМИ ДЛЯ ВИРІШЕННЯ СИСТЕМ лінійних рівнянь
Пояснювальна записка
Курсова робота з дисципліни
"Інформатика"
ТПЖА.12203-01 81 01 ПЗ
Розробив студент гр. СК-00 ____________ / А. І. Іванов /
Керівник викладач
ФАОТ ____________ / К. І. Петров /
Курсова робота захищена з оцінкою "___________" "__"_____ 2002
Кіров 2002

Реферат
А. І. Іванов. Розробка програми для розв'язання систем лінійних рівнянь: ТПЖА 12203-01 81 01 ПЗ. Курсова робота / ВятГУ, ФАОТ, рук. К. І. Петров - Кіров, 2002. ПЗ 7 с., 3 табл., 8 мал., 4 джерела, 4 дод.; Програм. докум. 18 л.

СИСТЕМА лінійних рівнянь, метод Зейделя, метод простої ітерації, МАТРИЦЯ КОЕФІЦІЄНТІВ, ВЕКТОР ВІЛЬНИХ ЧЛЕНІВ, УМОВА ЗБІЖНОСТІ
Об'єктом дослідження є ітераційні методи розв'язання систем лінійних алгебраїчних рівнянь (далі СЛАР): метод простих ітерацій і метод Зейделя.
Мета роботи - розробка програми для розв'язування СЛАР з довільною кількістю рівнянь.
Для отримання вектора рішень СЛАР реалізовані методи Зейделя і простих ітерацій.
Недоліком досліджуваного методу - неможливість знаходження рішення за кінцеве число ітерацій навіть за відсутності обчислювальної похибки.
Результати проведеної роботи можуть бути використані при вирішенні СЛАР з довільною кількістю рівнянь.
Середовище програмування - Borland C.


Зміст
Введення 2
1 Аналіз завдання і вибір методу рішення 3
1.1 Аналіз завдання 3
1.2 Вибір методу рішення 3
1.2.1 Метод простих ітерацій 4
1.2.2 Метод Зейделя 4
2 Реалізація методу розв'язання задачі 5
2.1 Контроль вхідний інформації 5
2.2 Формат виводу вихідний інформації 5
2.3 Вибір типів вхідних, робочих і вихідних змінних,
використовуються у програмі 6
2.4 Проектування програми 6
2.5 Аналіз результату 6
Висновок 7
Додаток А (обов'язковий) Розробка програми для розв'язання систем лінійних рівнянь. Опис програми. ТПЖА.12203-01 13 1 Серпня
Додаток Б (обов'язковий). Розробка програми для розв'язання систем лінійних рівнянь. Керівництво користувача. ТПЖА.12203-січні 1934 2001 ..
Додаток В (обов'язковий). Розробка програми для розв'язання систем лінійних рівнянь. Текст програми. ТПЖА.12203-01 12 січня 1923
Додаток Г (довідковий) 45


Введення
Рішення СЛАР є однією з важливих обчислювальних завдань, що часто зустрічаються в прикладній математиці. До вирішення систем лінійних рівнянь зводиться ряд завдань аналізу, пов'язаних з наближенням функцій, рішення систем диференціальних рівнянь та інтегральних рівнянь і т.д.
У зв'язку з використанням великої кількості змінних в системі ручної розрахунок СЛАР досить трудомісткий і може зайняти багато часу. Актуальність даної курсової роботи полягає в тому, що вищеописана проблема вирішується за допомогою розробленої курсової програми.
Курсова робота носить навчальний характер. У ході її програміст реалізував наявні знання з курсу лінійної алгебри за рішенням СЛАР у програмній інтерпретації на мові програмування С. А знання комп'ютера та наявність досвіду в програмуванні в наш час особливо вітається у фірмах, що працюють у сфері інформаційних технологій.

1 Аналіз завдання і вибір методу вирішення
1.1 Аналіз завдання
Відповідно до завдання на курсову роботу необхідно розробити програму для вирішення СЛАР методом простих ітерацій і методом Зейделя. Передбачити введення числа рівнянь, матриці коефіцієнтів і вектора вільних членів, а також виведення вектора рішень на екран.
Для зручності тестування програма повинна мати зрозумілим і логічним інтерфейсом, розрахованим на недосвідченого користувача.
1.2 Вибір методу розв'язання
Відповідно до завдання на курсову роботу в програмі реалізовані ітераційні методи: простих ітерацій і Зейделя.
Нехай шукається рішення невиродженої системи рівнянь [1]
.
(1)
Першим кроком у ітераційному методі є перетворення вихідної системи до виду [1]
,
(2)
де матриці С, В і вектор d визначаються за матриці А і вектора b. Причому системи (1) і (2) є еквівалентними, тобто їх вирішення збігаються, а побудова оберненої матриці С-1 простіше, ніж А-1. [1]
Другим кроком є ​​розстановка індексів або номерів наближень у (2) і завдання нульового наближення. Наприклад,

(3)
де - заданий вектор [1]
Третім кроком ітераційного методу є обгрунтування збіжності послідовних наближень, отриманих з (3), до точного розв'язання х системи та оцінка похибки k-го наближення [1]

(4)
Оцінка (4) при заданому дозволяє зупинити ітераційний про-цес (3). [1]
Різні ітераційні методи відрізняються першими двома кроками, а вибір конкретного методу повинен здійснюватися на підставі оцінки (4). [1]
1.2.1 Метод простих ітерацій
У методі простих ітерацій матриця З (2) вибирається одиничної: З = Е. Ітераційний процес описується формулою

(5)
де - заданий вектор. [1]
1.2.2 Метод Зейделя
Відмінність методу Зейделя від простої ітерації полягає лише в тому, що при обчисленні (k +1)-го наближення отримані компоненти вектора відразу ж використовуються в обчисленнях. У матричній запису це можна представити так:

де матриці U та L отримані розкладанням В в суму:

матриця U - верхня трикутна частина B, включаючи діагональ; L - нижня поддіагональная частина В. [1]
Таким чином метод Зейделя можна записати в наступній формі

(6)
Зауважимо, що побудова матриці, зворотного, не становить труднощів, оскільки це нижня трикутна матриця. [1]
2 Реалізація методу розв'язання задачі
2.1 Контроль вхідної інформації
Метод контролю вхідної інформації повинен забезпечити максималь-ную захист від некоректності даних, що вводяться, захист від переповнення рядки і мінімальний перелік обмежень при введенні інформації.
У програмі вхідні дані, задаються користувачем в режимі діалогового вікна. Це дозволяє практично повністю контролювати вхідну інформацію та уникнути некоректності даних, що вводяться, так як далі ця інформація використовується в обчисленнях. Функції float_input () і n_input () призначені для захисту від некоректного введення дійсних і натуральних чисел відповідно (додаток В).
2.2 Формат виводу вихідний інформації
Висновок результатів розрахунку проводиться у вікні Output.
У вікні виводиться вихідна СЛАР, нижче вектор рішень, а також число ітерацій, необхідних для знаходження рішення.
2.3 Вибір типів вхідних, робочих і вихідних змінних, що використовуються в програмі
У програмі використано такі змінні:
char ch
int s
int n
double ** A
double * B
double * X
bool inpflag = false
bool decflag = false
переміщення між вікнами
кількість ітерацій
розмірність матриць
матриця коефіцієнтів
вектор вільних членів
вектор рішень
прапорець виконання операції введення
прапорець виконання операції рішення
2.4 Проектування програми
Робочий модуль програми - Zeidel.cpp.
Для коректної роботи програми реалізовані методи коректного введення вхідної інформації, рішення СЛАР з поясненням виконуваних дій, форматований висновок вихідної інформації на екран і в файл. Для зручності тестування розроблений інтерфейс, розрахований на недосвідченого користувача.
2.5 Аналіз результату
У результаті виконаної програмістом роботи розроблена програма, яка реалізує рішення СЛАР методами Зейделя і простих ітерацій і виконана в зручному і зрозумілому інтерфейсі, зрозумілому недосвідченому користувачеві.
Приклад розрахунку СЛАР з наступними вхідними даними:
Вихідна матриця А 45 8.6
7.3 8.1
Вектор вільних членів В 12
4.5
Результати розрахунку:
Вектор рішень 0.1938
0.3809
Число ітерацій 5
Висновок
В ході курсової роботи був розроблений програмний продукт, в рамках якого були реалізовані:
 метод простих ітерацій для вирішення СЛАР;
 метод Зейделя для вирішення СЛАР;
 зручний віконний інтерфейс для недосвідченого оператора;
 захист від неправильного вводу вхідної інформації;


Додаток А
(Обов'язковий)
МІНІСТЕРСТВО ОСВІТИ
Державні освітні установи
ВИЩОЇ ОСВІТИ
Вятський державний УНІВЕРСИТЕТ
ФАОТ
РОЗРОБКА ПРОГРАМИ ДЛЯ ВИРІШЕННЯ СИСТЕМ лінійних рівнянь
ОПИС ПРОГРАМИ
Лист затвердження
ТПЖА.12203-13 січня 2001-ЛУ
Аркушів 2
Розробив студент гр. СК-00 ____________ / А. І. Іванов /
Керівник викладач
ФАОТ ____________ / К. І. Петров /
Кіров 2002

Додаток А
(Обов'язковий)
МІНІСТЕРСТВО ОСВІТИ
Державні освітні установи
ВИЩОЇ ОСВІТИ
Вятський державний УНІВЕРСИТЕТ
ФАОТ
Лист затвердження
ТПЖА.12203-13 січня 2001-ЛУ
РОЗРОБКА ПРОГРАМИ ДЛЯ ВИРІШЕННЯ СИСТЕМ лінійних рівнянь
ОПИС ПРОГРАМИ
ТПЖА.12203-13 січня 2001
Листів 8
Кіров 2002

Анотація
У розділі «Опис програми» розглянуті функціональні характеристики програми. Перераховано необхідні технічні засоби для її нормальної роботи, а також вхідні і вихідні дані. Наведено необхідні схеми алгоритмів.

Зміст
1 Загальні відомості 12
2 Склад і структура програмного модуля 12
3 Опис логічної структури 13
4 Вхідні дані 14
5 Вихідні дані 14
6 Схеми алгоритмів програми 15

1 Загальні відомості
Вихідний текст програми написаний на мові С.
2 Склад і структура програмного модуля
Програмний код представлений в модулі Zeidel.cpp, склад якого подано в таблиці А.1.
Таблиця А.1 - Склад програмного модуля Zeidel.cpp
Функція Призначення
main Основна функція програми
input Введення вихідних даних
float_input Введення дійсних чисел
n_input Введення натуральних чисел
decision Рішення СЛАР
output Висновок результату роботи програми
menu Функція малювання пунктів меню
help Вивід на екран інформації про програму та розроблення Чіке
cursor Навігація курсору

Даний програмний продукт має структуру, представлену на рисунку А.1.

Рисунок А.1 - Структура програмного модуля
3 Опис логічної структури
Функція main - основна функція програми, що реалізовує меню для вибору необхідної операції. Тіло функції являє собою цикл, у якому проводиться вивід рядків меню, очікування введення символу з клавіатури і подальший аналіз введеного символу.
Навігація в меню здійснюється клавішами курсору. І відповідно до вибраним пунктом відкривається діалогове вікно.
Функція menu грає сполучна ланка в інтерфейсі програми - ви-водить на екран меню програми.
Введення даних здійснюється функцією input, а перевірка коректності введеної інформації функціями float_input, яка дозволяє вводити дійсні числа, і n_input, що дозволяє вводити натуральні числа, а також обмежує введення цифр у числі і перешкоджає введенню інших символів.
Рішення введеної СЛАР реалізовано у функції decision. При цьому користувачеві пропонується вибір методу розв'язання СЛАР (метод Зейделя або
метод простих ітерацій).
Висновок результатів здійснюється функцією output на екран.
У разі вибору опцій «Decision» і «Output» без виконання опції «Input» і опції «Output» без «Decision» програма видасть попереджувальне повідомлення з нагадуванням виконання необхідних дій.
3 Вхідні дані
Вхідні дані представлені в таблиці A.2.
Таблиця А.2 - Вхідні дані
Змінна Діапазон Призначення
int n 1 ... 10 Розмірність матриць
double ** А -99.99 ... 99.999 Матриця коефіцієнтів
double * У Вектор вільних членів
4 Вихідні дані
Вихідні дані представлені в таблиці A.3.
Таблиця А.3 - Вхідні дані
Змінна Діапазон Призначення
double * X-3.4Е-38 ... 3.4Е +38 Вектор рішень СЛАР
5 Схеми алгоритмів програми
Схема алгоритму функції decision представлена ​​на малюнку A.2.

Рисунок А.2 - Схема алгоритму функції
void decision (double ** & A, double * & B, double * & X, int & n, int & s)


Додаток Б
(Обов'язковий)
МІНІСТЕРСТВО ОСВІТИ
Державні освітні установи
ВИЩОЇ ОСВІТИ
Вятський державний УНІВЕРСИТЕТ
ФАОТ
РОЗРОБКА ПРОГРАМИ ДЛЯ ВИРІШЕННЯ СИСТЕМ лінійних рівнянь
КЕРІВНИЦТВО ОПЕРАТОРА
Лист затвердження
ТПЖА.12203-01 34 01-ЛУ
Аркушів 2
Розробив студент гр. СК-02 ____________ / А. І. Іванов /
Керівник викладач
ФАОТ ____________ / К. І. Петров /
Кіров 2002
Додаток Б
(Обов'язковий)
МІНІСТЕРСТВО ОСВІТИ
Державні освітні установи
ВИЩОЇ ОСВІТИ
Вятський державний УНІВЕРСИТЕТ
ФАОТ
Лист затвердження
ТПЖА.12203-01 34 01-ЛУ
РОЗРОБКА ПРОГРАМИ ДЛЯ ВИРІШЕННЯ СИСТЕМ лінійних рівнянь
КЕРІВНИЦТВО ОПЕРАТОРА
ТПЖА.12203-січні 1934 2001
Листів 7
Кіров 2002
Анотація
У додатку «Керівництво оператора" зазначені докладні інструкції по роботі з програмою. У цьому додатку вказані умови, необхідні для запуску програми, а також з чого слід починати роботу. Також додаток містить докладний опис користувальницького інтерфейсу програми.

Зміст
1 Умови виконання програми 20
2 Запуск 20
3 Обробка критичних ситуацій 20
4 Робота з програмою 21
4.1 Введення вихідних даних 21
4.2 Рішення СЛАР 21
4.3 Висновок результату роботи 21
1 Умови виконання програми
Файл Zeidel.exe є головним модулем, і його присутність гарантує коректний запуск програми.
2 Запуск
Для початку роботи з програмою слід запустити файл Zeidel.exe. Екранна форма програми після запуску показана на рисунку Б.1.

Рисунок Б.1 - Екранна форма програми
3 Обробка критичних ситуацій
Навігація у програмі здійснюється клавішами курсору (зелена смужка в меню).
Програма забезпечена захистом від некоректних дій користувача, зокрема: вибір пунктів «Decision» і «Output» без введення вихідних даних у програму, вибір пункту «Output» не виконавши опцію «Decision». На малюнку Б.2 показаний приклад роботи програми в критичній ситуації.
Рисунок Б.2 - Приклад роботи програми в критичній ситуації
4 Робота з програмою
4.1 Введення вихідних даних
При виборі пункту меню «Input» екрані з'явиться діалогове вікно введення даних, показане на рисунку Б.3.

Малюнок Б.3 - Вікно введення вихідних даних
4.2 Рішення системи
Рішення СЛАР реалізовано в опції «Decision» (див. малюнок Б.4).

Малюнок Б.4 - Вікно рішення СЛАР
4.3 Висновок результату роботи
Висновок отриманого вектора рішень СЛАР передбачений на екран. Діалогове вікно, викликане зверненням користувача «Output» представлено на малюнку Б.5.

Малюнок Б.5 - Вікно виведення результату на екран
При введенні більше 5 рівнянь система повністю не поміщається у вікно виведення результату. У цьому випадку передбачено прокрутка матриці вліво, вправо, вниз і вгору. Діалогове вікно при скролінгу представлено на малюнку Б.6.
Рисунок Б.6 - Вікно виведення результату на екран


Додаток В
(Обов'язковий)
МІНІСТЕРСТВО ОСВІТИ
Державні освітні установи
ВИЩОЇ ОСВІТИ
Вятський державний УНІВЕРСИТЕТ
ФАОТ
РОЗРОБКА ПРОГРАМИ ДЛЯ ВИРІШЕННЯ СИСТЕМ лінійних рівнянь
ТЕКСТ ПРОГРАМИ
Лист затвердження
ТПЖА.12203-12 січень 2001-ЛУ
Аркушів 2
Розробив студент гр. СК-00 ____________ / А. І. Іванов /
Керівник викладач
ФАОТ ____________ / К. І. Петров /
Кіров 2002
Додаток В
(Обов'язковий)
МІНІСТЕРСТВО ОСВІТИ
Державні освітні установи
ВИЩОЇ ОСВІТИ
Вятський державний УНІВЕРСИТЕТ
Факультет прикладної математики та телекомунікацій
Кафедра радіоелектронних засобів
Лист затвердження
ТПЖА.12203-12 січень 2001-ЛУ
РОЗРОБКА ПРОГРАМИ ДЛЯ ВИРІШЕННЯ СИСТЕМ лінійних рівнянь
ТЕКСТ ПРОГРАМИ
ТПЖА.12203-12 січень 2001
Листів 22
Кіров 2002

Анотація
Додаток «Текст програми» містить повний код програми.

Зміст
1 menu 27
2 cursor 28
3 float_input 31
4 n_input 32
5 about 33
6 task 34
7 help 34
8 input 35
9 decision 37
10 output 39
Листопад 1942

/ *
Розробити програму для розв'язання систем лінійних рівнянь.
Реалізувати методи а) простих ітерацій; б) Зейделя.
Передбачити введення числа рівнянь (до 10), матриці коефіцієнтів
і вектора вільних членів.
Виконав студент гр. СК-06 Мамаєв С.В.
* /
# Include <stdio.h>
# Include <stdlib.h>
# Include <conio.h>
# Include <math.h>
# Include <string.h>
/ / Функція відтворення меню
//------------------------------------------------ ------------------------------
void menu ()
{
window (1,1,80,25);
textbackground (BLACK);
clrscr ();
window (1,1,80,1);
textbackground (LIGHTGRAY);
clrscr ();
gotoxy (1,1);
textcolor (RED);
cprintf ("% s", "H");
textcolor (BLACK);
cprintf ("% s", "elp");
gotoxy (9,1);
textcolor (RED);
cprintf ("% s", "I");
textcolor (BLACK);
cprintf ("% s", "nput");
gotoxy (18,1);
textcolor (RED);
cprintf ("% s", "D");
textcolor (BLACK);
cprintf ("% s", "ecision");
gotoxy (29,1);
textcolor (RED);
cprintf ("% s", "O");
textcolor (BLACK);
cprintf ("% s", "utput");
window (1,25,80,25);
textbackground (LIGHTGRAY);
clrscr ();
cprintf ("Alt + X - exit");
gotoxy (70,1);
textcolor (BLACK);
}
//------------------------------------------------ ------------------------------
/ / Курсор
//------------------------------------------------ ------------------------------
void cursor (int n)
{
if (n == 1)
{
window (1,1,5,1);
textbackground (GREEN);
clrscr ();
textcolor (RED);
cprintf ("% s", "H");
textcolor (BLACK);
cprintf ("% s", "elp");
window (5,1,5,1);
textbackground (LIGHTGRAY);
clrscr ();
}
if (n == 2)
{
window (9,1,14,1);
textbackground (GREEN);
clrscr ();
textcolor (RED);
cprintf ("% s", "I");
textcolor (BLACK);
cprintf ("% s", "nput");
window (14,1,14,1);
textbackground (LIGHTGRAY);
clrscr ();
}
if (n == 3)
{
window (18,1,26,1);
textbackground (GREEN);
clrscr ();
textcolor (RED);
cprintf ("% s", "D");
textcolor (BLACK);
cprintf ("% s", "ecision");
window (26,1,26,1);
textbackground (LIGHTGRAY);
clrscr ();
}
if (n == 4)
{
window (29,1,35,1);
textbackground (GREEN);
clrscr ();
textcolor (RED);
cprintf ("% s", "O");
textcolor (BLACK);
cprintf ("% s", "utput");
window (35,1,35,1);
textbackground (LIGHTGRAY);
clrscr ();
}
if (n == 6)
{
window (3,3,8,3);
textbackground (GREEN);
clrscr ();
textcolor (RED);
cprintf ("% s", "A");
textcolor (BLACK);
cprintf ("% s", "bout");
window (8,3,8,3);
textbackground (LIGHTGRAY);
clrscr ();
}
if (n == 7)
{
window (3,4,7,4);
textbackground (GREEN);
clrscr ();
textcolor (RED);
cprintf ("% s", "T");
textcolor (BLACK);
cprintf ("% s", "ask");
window (7,4,7,4);
textbackground (LIGHTGRAY);
clrscr ();
}
if (n == 8)
{
window (10,3,18,3);
textbackground (GREEN);
clrscr ();
textcolor (RED);
cprintf ("% s", "K");
textcolor (BLACK);
cprintf ("% s", "eyboard");
window (18,3,18,3);
textbackground (LIGHTGRAY);
clrscr ();
}
if (n == 9)
{
window (10,4,14,4);
textbackground (GREEN);
clrscr ();
textcolor (RED);
cprintf ("% s", "F");
textcolor (BLACK);
cprintf ("% s", "ile");
window (14,4,14,4);
textbackground (LIGHTGRAY);
clrscr ();
}
if (n == 10)
{
window (30,3,37,3);
textbackground (GREEN);
clrscr ();
textcolor (RED);
cprintf ("% s", "D");
textcolor (BLACK);
cprintf ("% s", "isplay");
window (37,3,37,3);
textbackground (LIGHTGRAY);
clrscr ();
}
if (n == 11)
{
window (30,4,34,4);
textbackground (GREEN);
clrscr ();
textcolor (RED);
cprintf ("% s", "F");
textcolor (BLACK);
cprintf ("% s", "ile");
window (34,4,34,4);
textbackground (LIGHTGRAY);
clrscr ();
}
}
//------------------------------------------------ ------------------------------
/ / Функція введення натурального числа
//------------------------------------------------ ------------------------------
int n_input (int max)
{
char ch;
char str [100];
int i = 0;
do
{
ch = (char) getch ();
if (i == 0)
{
if ((ch> '0')&&( ch <= '9 '))
{
str [i + +] = ch;
putch (ch);
}
}
else
{
if ((ch> = '0')&&( ch <= '9 '))
{
str [i + +] = ch;
putch (ch);
}
}
if ((ch == '\ r')&&( i == 0)) / / якщо натиснута клавіша ENTER і нічого не введено
{
ch = 'x';
printf ("\ b"); / / backspace
}
if ((ch == '\ b')&&( i> 0)) / / якщо натиснута клавіша BACKSPACE
{
i -;
printf ("\ b \ b");
}
if (i == (max +1)) / / якщо досягли max кількості цифр
{
i -;
printf ("\ b \ b");
}
}
while (ch! = '\ r');
str [i] = '\ 0';
for (int j = i; j> 0; j -)
printf ("\ b \ b");
printf ("% d", atoi (str));
return atoi (str); / / перетворимо в число
}
//------------------------------------------------ ------------------------------
/ / Функція введення дійсного числа
//------------------------------------------------ ------------------------------
double float_input ()
{
const max = 6; / / максимальна кількість цифр у числі
int i = 0; / / лічильник введення символу
char ch, buffer [max];
bool flp = 0; / / прапорець введення символу "."
bool fle = 0; / / прапорець введення "е"
do
{
ch = (char) getch ();
if ((ch =='-')&&(( i == 0) | | (buffer [i-1] == 'e'))) / / введення "-"
{/ / На початку рядка
buffer [i + +] = ch; / / і після "е"
putch (ch);
}
if ((ch> = '0')&&( ch <= '9 ')) / / введення цифр
{
buffer [i + +] = ch;
putch (ch);
}
if (((ch =='.')||( ch ==','))&&( flp == 0)) / / введення плаваючої
{/ / Точки
buffer [i ++]='.';
putch ('.');
flp = 1;
}
if ((ch == 'e' | | ch == 'E') & & i> 0 & & fle == 0)
{/ / Введення "е"
buffer [i ++]=' e ';
putch ('e');
fle = 1;
}
if ((ch == '\ b')&&( i> 0)) / / введення коду
{/ / Клавіші
i -; / / BACKSPACE
cprintf ("\ b \ b");
if (buffer [i ]=='.') flp = 0;
if (buffer [i] == 'E') fle = 0;
}
if ((ch == '\ r')&&( i == 0)) ch =' \ 0 ';
if (i == (max +1))
{
i -;
cprintf ("\ b \ b");
}
} While (ch! = '\ r');
buffer [i] = '\ 0', / / ​​"закриття" рядки
for (int j = i; j> 0; j -)
cprintf ("\ b \ b");
cprintf ("% 2.2e", strtod (buffer, 0));
return strtod (buffer, 0); / / перетворення до речовин. значенням
}
//------------------------------------------------ ------------------------------
/ / Про програму
//------------------------------------------------ ------------------------------
void about ()
{
char ch;
window (25,8,59,18);
textbackground (BLACK);
clrscr ();
window (24,7,58,17);
textbackground (LIGHTGRAY);
textcolor (BLACK);
clrscr ();
cprintf ("\ n \ r ђ § а Ў ® вЄ Їа ® Ја ¬ ¬ л ¤« п ॳҐЕп ");
cprintf ("\ n \ r бЕб⥠¬« ЕҐ © ле га ўҐЕ © ");
cprintf ("\ n \ n \ r, ҐабЕп 1.0 2007Ј.");
cprintf ("\ n \ n \ r, лЇ ®« Е «БВГ ¤ Ґв Ја. 'Љ-06");
cprintf ("\ n \ r Њ ¬ Ґў'.,.");
cprintf ("\ n \ n \ r" «п Їа ®¤®«| ҐЕп | ¬ Е⥠<Enter>");
do
{
ch = (char) getch ();
}
while (ch! = 13); / / поки не натиснутий ENTER
}
//------------------------------------------------ ------------------------------
/ / Текст завдання
//------------------------------------------------ ------------------------------
void task ()
{
char ch;
window (21,6,62,20);
textbackground (BLACK);
clrscr ();
window (20,5,61,19);
textbackground (LIGHTGRAY);
textcolor (BLACK);
clrscr ();
cprintf ("\ n \ n \ n \ r ђ § а Ў ® в вм Їа ® Ја ¬ ¬ г ¤« п ॳҐЕп бЕб⥠¬ ");
cprintf ("\ n \ r« ЕҐ © ле га ўҐЕ ©. ђҐ «Е § ® ў вм ¬ Ґв ® ¤ л:");
cprintf ("\ n \ r) Їа ® бвле ЕвҐа ж ©; Ў) ‡ Г © ¤ Г« п. ЏаҐ ¤ гб ¬®-");
cprintf ("\ n \ r ваҐвм ўў ® ¤ зеб« га ўҐЕ © (¤ ® 10), ¬ в-");
cprintf ("\ n \ r аЕжл Є ® нддЕжЕҐв ® ў Е ўҐЄв ® а бў ® Ў ® ¤ ле");
cprintf ("\ n \ r з« Г ® ў. ");
cprintf ("\ n \ n \ n \ n \ n \ r" «п Їа ®¤®«| ҐЕп | ¬ Е⥠<Enter>");
do
{
ch = (char) getch ();
}
while (ch! = 13); / / поки не натиснутий ENTER
}
//------------------------------------------------ ------------------------------
/ / Вікно help
//------------------------------------------------ ------------------------------
void help ()
{
char ans;
int h_num = 1;
do
{
menu (); / / вивід меню
window (3,4,12,5);
textbackground (BLACK);
clrscr ();
window (2,3,11,4);
textbackground (LIGHTGRAY);
clrscr ();
textcolor (RED);
cprintf ("% s", "A");
textcolor (BLACK);
cprintf ("% s", "bout");
textcolor (RED);
cprintf ("% s", "\ n \ r T");
textcolor (BLACK);
cprintf ("% s", "ask");
cursor (h_num +5);
ans = (char) getch ();
if (ans == 80) {if (h_num! = 2) h_num + +;} / / якщо натиснули "стрілку вниз"
if (ans == 72) {if (h_num! = 1) h_num -;} / / якщо натиснули "стрілку вгору"
}
while ((ans! = 27) & & (ans! = 'a')&&( ans! =' A')&&( ans! = 't')&&( ans! =' T')&&( ans! = 13 ));
if ((ans == 't')||( ans ==' T')||(( h_num == 2) & & (ans == 13)))
{
window (2,3,14,6);
textbackground (BLACK);
clrscr ();
task (); / / вікно виведення тексту завдання
}
if ((ans == 'a')||( ans ==' A')||(( h_num == 1) & & (ans == 13)))
{
window (2,3,14,6);
textbackground (BLACK);
clrscr ();
about (); / / вікно виведення інформації про розробника
}
}
//------------------------------------------------ ------------------------------
/ / Функція введення даних
//------------------------------------------------ ------------------------------
void input (double ** & A, double * & B, int & n)
{
char ch;
window (8,3,20,6);
textbackground (BLACK);
clrscr ();
window (15,6,64,18);
textbackground (LIGHTGRAY);
clrscr ();
textcolor (BLACK);
cprintf ("% s", "\ n \ n \ r, ўҐ ¤ Е⥠зеб« ® га ўҐЕ © (1 .. 10) ");
window (48,8,51,8);
textbackground (BLACK);
textcolor (LIGHTGRAY);
clrscr ();
bool fl = false;
do / / захист від введення числа рівнянь більше 10
{
n = n_input (2); / / функція введення двозначного числа
if ((n <= 10) & & (n> = 1)) fl = true;
else clrscr ();
}
while (fl! = true);
A = (double **) malloc (n * n * sizeof (double)); / / виділення пам'яті для масиву
B = (double *) malloc (n * sizeof (double));
window (15,10,64,10);
textbackground (LIGHTGRAY);
clrscr ();
textcolor (BLACK);
cprintf ("% s", "\ r, ўҐ ¤ ЕвҐ н« Г ¬ Ґвл ¬ ваЕжл Є ® нддЕжЕҐв ® ў ");
window (15,11,64,11);
textbackground (LIGHTGRAY);
clrscr ();
for (int i = 0; i <n; i + +)
{
A [i] = (double *) malloc (n * sizeof (double));
for (int j = 0; j <n; j + +)
{
clrscr ();
cprintf ("\ r A [% d] [% d] =", i +1, j +1);
A [i] [j] = float_input (); / / введення дійсного числа
}
}
window (15,13,64,13);
textbackground (LIGHTGRAY);
clrscr ();
cprintf ("% s", "\ n \ n \ r, ўҐ ¤ ЕвҐ н« Г ¬ Ґвл ўҐЄв ® а бў ® Ў ® ¤ ле з «Г ® ў");
window (15,14,64,14);
textbackground (LIGHTGRAY);
clrscr ();
for (int i = 0; i <n; i + +)
{
clrscr ();
cprintf ("\ r B [% d] =", i +1);
B [i] = float_input (); / / введення дійсного числа
}
window (15,17,64,17);
textbackground (LIGHTGRAY);
clrscr ();
cprintf ("% s", "\ r" «п Їа ®¤®«| ҐЕп | ¬ Е⥠<Enter>");
do
{Ch = (char) getch ();}
while (ch! = 13); / / поки не натиснутий ENTER
}
//------------------------------------------------ ------------------------------
/ / Функція рішення
//------------------------------------------------ ------------------------------
void decision (double ** & A, double * & B, double * & X, int & n, int & s)
{
char ch, ans;
int k;
double * Z; / / допоміжний вектор
X = (double *) malloc (n * sizeof (double)); / / Вектор рішень
Z = (double *) malloc (n * sizeof (double)); / / Вектор початкових наближень
for (int i = 0; i <n; i + +) Z [i] = 1;
window (23,7,57,16);
textbackground (LIGHTGRAY);
textcolor (BLACK);
clrscr ();
cprintf ("\ n \ r, лЎЕаЕ⥠¬ Ґв ® ¤ ॳҐЕп:");
cprintf ("\ n \ r 1-ЊҐв ® ¤ Їа ® бвле ЕвҐа ж ©");
cprintf ("\ n \ r 2-ЊҐв ® ¤ ‡ Г © ¤ Г« п ");
do
{Ans = (char) getch ();}
while ((ans! = '1')&&( ans! = '2 '));
if (ans == '1 ') / / Метод простих ітерацій
{
s = 0;
do
{
k = 0;
for (int i = 0; i <n; i + +)
{
X [i] = B [i] * (-1);
for (int j = 0; j <n; j + +)
{X [i] = X [i] + (double) A [i] [j] * Z [j];}
if (A [i] [i]! = 0)
{
if (fabs ((double) X [i] / A [i] [i])> = 0.0001) k = 1; / / перевірка на збіжність
X [i] = Z [i] - (double) X [i] / A [i] [i]; / / якщо сходиться-> k = 0 -> вихід з циклу
}
}
for (int i = 0; i <n; i + +)
Z [i] = X [i];
s + +; / / + + ітерація
if (s == 100) k = 0; / / якщо ітерацій> 100 -> вихід з циклу
}
while (k! = 0);
}
if (ans == '2 ') / / Метод Зейделя
{
s = 0;
do
{
k = 0;
for (int i = 0; i <n; i + +)
{
X [i] = B [i] * (-1);
for (int j = 0; j <n; j + +)
{
if (A [i] [j]! = 0)
X [i] = X [i] + (double) A [i] [j] * Z [j];
}
if (A [i] [i]! = 0)
{
if (fabs ((double) X [i] / A [i] [i])> = 0.001) k = 1; / / перевірка на збіжність
X [i] = Z [i] - (double) X [i] / A [i] [i];
Z [i] = X [i];
}
}
s + +;
if (s == 100) k = 0; / / кількість ітерацій повинно бути менше 100
} / / Інакше цикл припиняється-> система не має рішень
while (k! = 0);
}
cprintf ("\ n \ n \ r ђ бзсвл н Є ® зҐл");
cprintf ("% s", "\ n \ n \ n \ r" «п Їа ®¤®«| ҐЕп | ¬ Е⥠<Enter>");
do
{Ch = (char) getch ();}
while (ch! = 13);
}
//------------------------------------------------ ------------------------------
/ / Функція виводу даних на екран або у файл
//------------------------------------------------ ------------------------------
void output (double ** & A, double * & B, double * & X, int & n, int & s)
{
char ch_out;
int xx = 5, yy = 5; / / змінні скролінгу
float temp; / / Допоміжна змінна
window (1,25,80,25);
textbackground (LIGHTGRAY);
clrscr ();
cprintf ("Alt + X - exit Arrows - scrolling");
gotoxy (70,1);
textcolor (BLACK);
window (3,3,78,23);
textbackground (LIGHTGRAY);
textcolor (BLACK);
clrscr ();
if (s! = 100) / / якщо система має рішення
{
window (3,4,66,4);
textbackground (LIGHTGRAY);
clrscr ();
cprintf ("\ r 'Еб⥠¬ га ўҐЕ ©:"); / / система рівнянь
window (3,12,66,12);
textbackground (LIGHTGRAY);
clrscr ();
cprintf ("\ r, ҐЄв ® а ॳҐЕ ©"); / / вектор рішень
for (int i = 0; i <n; i + +)
{
if (i == 0)
{
window (3,13,30,19);
textbackground (LIGHTGRAY);
clrscr ();
}
if (i == 5) / / якщо число рівнянь> 5 -> у другій стовпець
{
window (32,13,70,19);
textbackground (LIGHTGRAY);
clrscr ();
}
cprintf ("\ n \ r X (% d) =% .4 f", i +1, X [i]); / / вивід рішення
}
window (3,20,66,20);
textbackground (LIGHTGRAY);
clrscr ();
cprintf ("\ n \ n \ r-Еб« ® ЕвҐа ж ©:% d ", s); / / число ітерацій
} / / If ...
else cprintf ("\ n \ n 'Еб⥠¬ Г Е ¬ ҐҐв ॳҐЕ ©");
window (14,22,66,22);
textbackground (LIGHTGRAY);
clrscr ();
cprintf ("\ n \ n \ r" «п Їа ®¤®«| ҐЕп | ¬ Е⥠<Enter>");
if (s! = 100) / / якщо система має рішення, тобто число ітерацій <100
{
window (4,5,77,10); / / вікно виведення системи рівнянь (неактивне)
textbackground (LIGHTGRAY); / / сірий фон
textcolor (BLACK);
clrscr ();
if (n <= 5) / / якщо система має не більше 5 рівнянь
{
for (int i = 0; i <n; i + +)
{
cprintf ("\ n \ r");
for (int j = 0; j <= n; j + +)
{
if (j == n) cprintf ("=%. 2f ", B [i]); / / вивід вектора вільних членів
else
{
if (j <n)
{
if (A [i] [j]> 0) cprintf ("+% .2 fX (% d)", A [i] [j], j +1);
else
{
temp = A [i] [j] * (-1); / / якщо виводиться негативний коефіцієнт
cprintf ("-% .2 fX (% d)", temp, j +1);
}
}
}
}
} / / For (i <n) ...
} / / If (n <= 5) ...
else / / якщо система має більше 5 рівнянь
{
window (4,6,72,10); / / вікно виведення системи рівнянь (активне)
textbackground (BLUE); / / синій фон
textcolor (WHITE);
do
{
clrscr ();
for (int i = xx-5; i <xx; i + +)
{
cprintf ("\ n \ r");
for (int j = yy-5; j <= yy; j + +)
{
if (j == n) cprintf ("=% .2 f", B [i]); / / вивід вектора вільних членів
else
{
if (j <n)
{
if (A [i] [j]> 0) cprintf ("+% .2 fX (% d)", A [i] [j], j +1);
else
{
temp = A [i] [j] * (-1);
cprintf ("-% .2 fX (% d)", temp, j +1);
}
}
}
}
}
ch_out = (char) getch ();
if ((ch_out == 80) & & (xx! = n)) xx + +; / / при натисканні "стрілки вниз" прокрутка вниз
if ((ch_out == 72) & & (xx! = 5)) xx -; / / при натисканні "стрілки вгору" прокрутка вгору
if ((ch_out == 77) & & (yy! = n)) yy + +; / / при натисканні "стрілки вправо" прокрутка вправо
if ((ch_out == 75) & & (yy! = 5)) yy -; / / при натисканні "стрілки вліво" прокрутка вліво
}
while (ch_out! = 27); / / при натисканні ESC
/ / Скролінг стає неактивним
window (4,6,77,10); / / вікно виведення системи рівнянь (неактивне)
textbackground (LIGHTGRAY); / / сірий фон
textcolor (BLACK);
clrscr (); / / виводимо систему рівнянь у новому неактивному вікні
for (int i = xx-5; i <xx; i + +)
{
cprintf ("\ n \ r");
for (int j = yy-5; j <= yy; j + +)
{
if (j == n) cprintf ("=% .2 f", B [i]); / / вивід вектора вільних членів
else
{
if (j <n)
{
if (A [i] [j]> 0) cprintf ("+% .2 fX (% d)", A [i] [j], j +1);
else
{
temp = A [i] [j] * (-1);
cprintf ("-% .2 fX (% d)", temp, j +1);
}
}
}
}
}
window (22,22,53,22);
textbackground (BLUE);
textcolor (WHITE);
clrscr ();
cprintf ("\ r" «п Їа ®¤®«| ҐЕп | ¬ Е⥠<Enter>"); / / підсвічує рядок синім фоном
} / / Else (n <= 5) ...
}
do / / поки не натиснута клавіша ENTER
{Ch_out = (char) getch ();}
while (ch_out! = 13);
}
//------------------------------------------------ ------------------------------
//================================================ ==============================
main ()
{
int n, / / ​​число рівнянь
m_num = 1,
s; / / число ітерацій
char ch, ch2;
bool inpflag = false, decflag = false; / / прапори стану
double * X, / / ​​вектор рішень
** A, / / ​​матриця коефіцієнтів
* B; / / вектор вільних членів
_setcursortype (_NOCURSOR); / / прибираємо курсор
do
{
menu ();
cursor (m_num);
ch = (char) getch ();
if ((ch == 'h')||( ch ==' H')||(( ch == 13) & & (m_num == 1))) help ();
if ((ch == 'i')||( ch ==' I')||(( ch == 13) & & (m_num == 2)))
{Input (A, B, n); inpflag = true;}
if (((ch == 'o')||( ch ==' O')||(( ch == 1913) & & (m_num == чотири )))&&( inpflag == false) & & (decflag = = false))
{
window (28,9,55,14);
textbackground (BLACK);
clrscr ();
window (27,8,54,13);
textbackground (LIGHTGRAY);
textcolor (BLACK);
clrscr ();
cprintf ("\ r \ n" лҐ Г ўўҐ ¤ Ґл Е Г ");
cprintf ("\ r \ n Ї ®« гзҐ ® ॳҐЕҐ! ");
cprintf ("\ n \ n \ r" «п ўле ® ¤ | ¬ Е⥠Esc");
do
{Ch2 = (char) getch ();}
while (ch2! = 27);
}
if (((ch == 'o')||( ch ==' O')||(( ch == 13) & & (m_num == 4 )))&&( inpflag == true) & & (decflag = = false))
{
window (28,9,55,14);
textbackground (BLACK);
clrscr ();
window (27,8,54,13);
textbackground (LIGHTGRAY);
textcolor (BLACK);
clrscr ();
cprintf ("\ r \ n ЌҐ Ї ®« гзҐ ® ॳҐЕҐ! ");
cprintf ("\ n \ n \ n \ r" «п ўле ® ¤ | ¬ Е⥠Esc");
do
{Ch2 = (char) getch ();}
while (ch2! = 27);
}
if (((ch == 'o')||( ch ==' O')||(( ch == 13) & & (m_num == 4 )))&&( inpflag == true) & & (decflag = = true))
{Output (A, B, X, n, s); decflag = false;}
if (((ch == 'd')||( ch ==' D')||(( ch == 13) & & (m_num == 3 )))&&( inpflag == true))
{Decision (A, B, X, n, s); decflag = true;}
if (((ch == 'd')||( ch ==' D')||(( ch == 13) & & (m_num == 3 )))&&( inpflag == false))
{
window (28,9,55,14);
textbackground (BLACK);
clrscr ();
window (27,8,54,13);
textbackground (LIGHTGRAY);
textcolor (BLACK);
clrscr ();
cprintf ("\ r \ n" лҐ Г ўўҐ ¤ Ґл! ");
cprintf ("\ n \ n \ n \ r" «п ўле ® ¤ | ¬ Е⥠Esc");
do
{Ch2 = (char) getch ();}
while (ch2! = 27);
}
if (ch == 77) {if (m_num! = 4) m_num + +;} / / клавіші "стрілка вправо" і
if (ch == 75) {if (m_num! = 1) m_num -;} / / "стрілка вліво"
}
while (ch! = 45); / / поки не натиснута комбінація ALT + X
}
//================================================ ==============================

Додаток Г
(Довідковий)
Бібліографічний список
1. Боглаев, Ю.П. Обчислювальна математика та програмування: Навчальний посібник для студентів Втузов [текст] / Ю.П. Боглаев. -М.: Вища школа, 1990 .- 544с.
2. Подбельський, В.В. Програмування на мові Сі: Навчальний посібник [Текст] / С.С. Фомін - М.: Фінанси і статистика, 1998. - 600 с.
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Курсова
63.1кб. | скачати


Схожі роботи:
Розв язання систем лінійних рівнянь методом Гауса
Чисельні методи розв`язання систем лінійних рівнянь
Автоматизація розв`язання систем лінійних алгебраїчних рівнянь
Ітераційні методи розв`язання систем лінійних алгебраїчних рівнянь
Прямі методи розв`язання систем лінійних алгебраїчних рівнянь
Точні методи розв`язання систем лінійних алгебраїчних рівнянь СЛАР
Ітераційні методи розв`язання системи лінійних алгебраїчних рівнянь
Розробка програми вирішення системи лінійних рівнянь
Метод Гаусса для вирішення систем лінійних рівнянь
© Усі права захищені
написати до нас